#include <REGX52.H>
#include "type.h"
#include "method.h"



// 设置三个结构体用于存储时钟、秒表、闹钟信息
time clock;
time stopwatch;
time alarm;
// 设置T1 T2辅助变量用于定时器的计数
unsigned char T1count = 0;
unsigned char T2count = 0;
// 设置变量用于判断当前秒表是否运行超过一个小时
unsigned char second_more_hour = 0;



// 设置一个变量用于表示当前时间的模式 后面赋值是枚举
extern unsigned int timemode;

// 秒表假暂停（暂停但继续计时
extern unsigned char stopwatch_fake_pause;
// 显示闹钟标志位
extern unsigned char showalarm;
// 闹钟响标志位
extern unsigned char alarming;
// 闹钟停止响起标志位
extern unsigned char stop_alarming;
// 设置变量用于判断还有多少秒闹钟可以响起
extern unsigned int alarm_reset_time;

void main(){
	LCD1602_Init();
	Timer0_Init();
	Timer1_Init();
	Timer2_Init();
	while(1);
}

void Timer0_Rountine() interrupt 1{
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xF8;		//设置定时初值
	KeyCheck();
}

void Timer1_Rountine() interrupt 3{
	TL1 = 0x00;
	TH1 = 0x4C;
	T1count++;
	if(T1count == 20){
		T1count = 0; 
		clock.s++;
		alarming_judge();
		// 每次+1判断进位
		CF(&clock);
		judge_alarm();
		// 时钟/校时模式显示
		if((timemode == CLOCK || timemode == SET) && (!showalarm)){
			LCD_ShowTime();
		}
	}
	// 若此时闹钟应该响起则响起，否则无事发生
	// 应该响起 —— 闹钟标志位置位且停止标志位清零
	// （在时钟闹钟时间一致且没有关闭闹钟的情况下
		Buzzer = (alarming && (!stop_alarming)) ? (~Buzzer) : Buzzer;
}

void Timer2_Rountine() interrupt 5{
	// 定时器2 TF硬件置位 软件清零
	TF2 = 0;
	T2count++;
	if( T2count == 2 ){
		T2count = 0;
		stopwatch.ms_10 += 7;
		CF(&stopwatch);
		if(stopwatch.h){
			second_more_hour = 1;
		}
		// 如果当前是秒表模式且不是假暂停状态则刷新显示
		if((timemode == STOPWATCH) && (!stopwatch_fake_pause)){
			LCD_ShowTime();
		}
	}
}
